home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / AMOS / AMOSList0597 / AMOSLIST / text0263.txt < prev    next >
Encoding:
Text File  |  1997-06-01  |  3.7 KB  |  145 lines

  1. palaste@cc.helsinki.fi wrote on 23-Mai-97:
  2.  
  3. > how to write a decent arithmetic evaluation routine in AMOS.
  4.  
  5. I've written some slow evaluation routine a long time  ago,  but  it  works
  6. quite well. You're able to use +, -, *, /, and ^ as operators, brakets, and
  7. varables, but no functions like sin() or cos().
  8.  
  9. Dim ELM#(30),CAL(30),PRI(30),VAR$(30),VAR#(30)
  10. DEZ$="."
  11. Input CAL$
  12. For X=0 To 320
  13.   VAR$(0)="x" : VAR#(0)=X
  14.   Gosub CALC
  15.   Plot X,RES#,1
  16. Next 
  17. End 
  18. CALC:
  19.   R$=Lower$(CAL$)+"="
  20.   COR=0 : ELM=0 : REC=0 : VOZ=1 : NUM=1 : KOM#=1.0
  21.   PRIBAS=0
  22.   For A=1 To Len(R$)
  23.     ER$=""
  24.     A$=Mid$(R$,A,1)
  25.     If COR
  26.       If REC=0
  27.         If A$=")"
  28.           Add PRIBAS,-20
  29.           If PRIBAS<0 : ER$="Too many closing brakets" : End If 
  30.         End If 
  31.         If Instr("+-*:/^=",A$)
  32.           If NUM
  33.             ELM#(ELM)=ELM#(ELM)*VOZ
  34.             VOZ=1
  35.           Else 
  36.             For V=0 To 30
  37.               If Instr(VAR$(V),VAR$)
  38.                 ELM#(ELM)=VAR#(V)
  39.                 Exit 
  40.               End If 
  41.             Next 
  42.             If V=31 : ELM#(ELM)=0 : ER$="Variable not found" : End If 
  43.             ELM#(ELM)=ELM#(ELM)*VOZ
  44.             VOZ=1
  45.           End If 
  46.         End If 
  47.         If A$="+" : CAL(ELM)=1 : End If 
  48.         If A$="-" : CAL(ELM)=1 : VOZ=-VOZ : End If 
  49.         If(A$>="a") and(A$<="z") and NUM=1
  50.           CAL(ELM)=2 : Add PRI(ELM),10
  51.           ELM#(ELM)=ELM#(ELM)*VOZ
  52.           VOZ=1
  53.           Inc ELM : REC=1 : COR=0
  54.         End If 
  55.         If A$="*" : CAL(ELM)=2 : Add PRI(ELM),10 : End If 
  56.         If A$="/" : CAL(ELM)=3 : Add PRI(ELM),10 : End If 
  57.         If A$="^" : CAL(ELM)=4 : Add PRI(ELM),15 : End If 
  58.         If Instr("+-*:/^",A$)
  59.           Inc ELM : REC=1 : COR=0
  60.         End If 
  61.       Else 
  62.         If A$="-" : VOZ=-VOZ : End If 
  63.         If Instr("*:/^",A$) : ER$="Unexpected operand!" : End If 
  64.       End If 
  65.     Else 
  66.       If A$="(" : Add PRIBAS,20 : End If 
  67.       If A$="-" : VOZ=-VOZ : End If 
  68.       If Instr("*:/^",A$) : ER$="Unexpected operand!" : End If 
  69.     End If 
  70.     If(A$>="a" and A$<="z")
  71.       If COR=0
  72.         VAR$=A$ : COR=1 : REC=0 : PRI(ELM)=PRIBAS : NUM=0
  73.       Else 
  74.         VAR$=VAR$+A$
  75.       End If 
  76.     End If 
  77.     If(A$>="0") and(A$<="9")
  78.       If COR=0
  79.         ELM#(ELM)=(Asc(A$)-48) : COR=1 : REC=0 : KOM#=1.0 : PRI(ELM)=PRIBAS
  80.         NUM=1
  81.       Else 
  82.         If NUM=0
  83.           VAR$=VAR$+A$
  84.         Else 
  85.           If KOM#=1.0
  86.             ELM#(ELM)=ELM#(ELM)*10+(Asc(A$)-48)
  87.           Else 
  88.             ELM#(ELM)=ELM#(ELM)+(Asc(A$)-48)/KOM#
  89.             KOM#=KOM#*10.0
  90.           End If 
  91.         End If 
  92.       End If 
  93.     End If 
  94.     If A$=DEZ$
  95.       If NUM
  96.         If KOM#=1.0
  97.           KOM#=10.0
  98.           If COR=0
  99.             ELM#(ELM)=0.0 : COR=1 : REC=0
  100.           End If 
  101.         Else 
  102.           ER$="Decimal point error!"
  103.         End If 
  104.       Else 
  105.         VAR$=VAR$+A$
  106.       End If 
  107.     End If 
  108.     If ER$<>"" Then Print ER$
  109.   Next 
  110.   ELM#(ELM)=ELM#(ELM)*VOZ
  111.   E=ELM
  112.   While ELM>0
  113.     For A=0 To ELM
  114.       If PRI(A)>=PRI(A+1)
  115.         If CAL(A)=1 : ELM#(A)=ELM#(A)+ELM#(A+1) : End If 
  116.         If CAL(A)=2 : ELM#(A)=ELM#(A)*ELM#(A+1) : End If 
  117.         If CAL(A)=3 : ELM#(A)=ELM#(A)/Max(ELM#(A+1),0.001) : End If 
  118.         If CAL(A)=4 : ELM#(A)=ELM#(A)^ELM#(A+1) : End If 
  119.         PRI(A)=0 : CAL(A)=CAL(A+1)
  120.         If A<ELM
  121.           For B=A+1 To ELM
  122.             ELM#(B)=ELM#(B+1) : CAL(B)=CAL(B+1) : PRI(B)=PRI(B+1)
  123.           Next 
  124.         End If 
  125.         Dec ELM
  126.         Exit 
  127.       End If 
  128.     Next 
  129.   Wend 
  130.   RES#=ELM#(0)
  131. Return 
  132.  
  133. -- 
  134. Best Regards,
  135.  _____    __   _  __  ______    ___  __  __   __
  136. |"("  \()/" ) (_)/" )("     \()/\" \(__)/" ) /" )
  137. |  )   )/  /    /  /| \______)/" \  \  /  /|/  /
  138. | (___//  /    /  /"|   |" | (  (_\__)/  /"/  /
  139. |  |  /  /"\  /  /  | _ |  | _\  /  //  /|/  /__
  140. |__| (__/___)(__/|__|(_)|__|(_)\/__/(__/ (__/(MM)
  141.  
  142.  
  143.  
  144.  
  145.